iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0
自我挑戰組

30天 Ruby on Rails 挑戰系列 第 5

Rails 30天挑戰第五天 CRUD(三)

  • 分享至 

  • xImage
  •  

CRUD建立&一些原理(三)

在上一篇講完CRUD的Create

再來寫Read

index

class BooksController < ApplicationController
    
  def index
    @books = Book.all
  end
      
end

index的實體變數有個慣例,後面都會加s變複數。
Book.all是透過Book這個model從資料庫的table裡撈東西,all會把所有table的東西撈出來。
不過其實.all不寫也沒差,直接寫@book = Book的效果也是一樣。
如果想把出來的順序倒著列出來,可以這樣寫:

class BooksController < ApplicationController
    
  def index
    @books = Book.order(id: :desc)
  end
      
end

再來寫index的view:

<h1>Hello World!!</h1>
    
<%= link_to "新增",new_book_path %>

<% @books.each do |book|%>
  
  <%= link_to book.title, book_path(book) %>
  
<% end%>

這裡用迴圈的方式把@books內的資料通通跑出來,在這邊有一點要注意,<% @books.each do |book|%>在這行code寫的是<% %>,而不是<%= %>,寫<%= %>在頁面會印出來,<% %>不會。所以如果寫<%= @books.each do |book|%>會把所有的資料都印出來喔。

<%= link_to book.title, book_path %>這行會把所有的title列出來,title本身是超連結,會連到show去。

book_path(book)book_path後面加一個(book)是因為我們需要找到路徑的:id

當Perfix與參數都一樣是book的時候,可以這樣寫:

<% @books.each do |book|%>
  
  <%= link_to book.title, book %>
  
<% end%>

這樣寫的效果跟寫book_path(book)一樣。

show

寫到這裡,相信大家都知道下一步要寫什麼了吧。

沒錯就是show的action

class BooksController < ApplicationController
    
  def show
    @book = Book.find(params[:id])
  end
      
end

我現在要透過model從資料庫拿資料,我要怎麼去篩選我要的東西?

這裡介紹三種常用的方法,find、find_by、where

find:

Book.find(id)find方法只能找id,如果寫Book.find(3),那就會去找id: 3的資料。find有個優點,只要他找不到就會回報錯誤。


find_by:

Book.find_by(title: "cat")find_by可以找{key: value},比find的條件相對自由,會取找符合條件的第一筆資料。但是如果找不到資料,find_by會回傳nil。


where:
Book.where(title: "cat")where的用法與find_by差不多,但不同的是,find_by只會找第一筆資料,而where會把所有符合條件的資料都找出來。


params[:id] 是什麼呢?在我們建立model的時候會有個默認的隱藏欄位id用來記錄流水編號。
在終端機輸入rails routes

會發現edit/show/update/destroy這四個路徑都會有:id,也就是他們需要找到這個id。
而這筆id的資料會被params包起來,用類似hash的寫法。因此我們只需要寫params[:id] 就能抓到這個id。


controller寫完後接著寫view,建立show.html.erb

<h1>標題:<%= @book.title %></h1>
<p>內容:<%= @book.content %></p>
<span>價格:<%= @book.price %></span>

上一篇
Rails 30天挑戰第四天 CRUD(二)
下一篇
Rails 30天挑戰第六天 CRUD(四)
系列文
30天 Ruby on Rails 挑戰6
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言